package controle;

import excecao.TurmaPossuiAlunosException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import modelo.Turma;
import modelo.AlunoTurma;
import modelo.Disciplina;
import service.DisciplinaService;
import service.TurmaService;
import util.FabricaDeObjetos;
import util.SelectOneDataModel;

/**
 *
 * @author SCHETTINO
 */
public class TurmaMB extends BaseMB {

    private TurmaService turmaService;
    private DisciplinaService disciplinaService;
    private List<Turma> lista;
    private Turma turmaCorrente;
    private ListDataModel listaDataModel;
    private List<AlunoTurma> listaAlunoTurma;
    private String nomeDisciplinaBusca;
    private SelectOneDataModel<Disciplina> comboDisciplina;

    public TurmaMB() {
        try {
            turmaService = (TurmaService) FabricaDeObjetos.getObjetoUnico(TurmaService.class);
            disciplinaService = (DisciplinaService) FabricaDeObjetos.getObjetoUnico(DisciplinaService.class);
        } catch (Exception ex) {
            Logger.getLogger(TurmaMB.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String exibirTodas() {
        lista = turmaService.getTodas();
        listaDataModel = new ListDataModel(lista);

        return "turmaExibirTodas";
    }

    private void getAlunos() {
        turmaCorrente = turmaService.getPorIdComListaAlunoTurmas(turmaCorrente.getId());

        listaDataModel = new ListDataModel(turmaCorrente.getListaAlunoTurma());
    }

    public String exibirTurmasPelaBusca() {
        getAlunos();

        return "turmaExibirTurmas";
    }

    public String editar() {
        turmaCorrente = (Turma) listaDataModel.getRowData();
        getComboDisciplina().setSelecao(turmaCorrente.getDisciplina().toString());
        
        return "editarTurma";
    }

    public String editarPelaBusca() {
        return "editarTurma";
    }

    private String excluir() {
        try {
            turmaService.remover(turmaCorrente);
            return "turmaExcluido";
        } catch (TurmaPossuiAlunosException e) {
            return "turmaNaoExcluido";
        }
    }
    
    public String exibirAlunosPelaExibirTodos() {
        turmaCorrente = (Turma) listaDataModel.getRowData();
        getAlunos();
        
        return "turmaExibirAlunos";
    }

    public String excluirPelaExibirTodos() {
        turmaCorrente = (Turma) listaDataModel.getRowData();

        return excluir();
    }

    public String excluirPelaBusca() {
        return excluir();
    }

    public String buscar() {
        turmaCorrente = new Turma();

        return "buscarTurma";
    }

    public String buscaPorId() {
        turmaCorrente = turmaService.getPorId(turmaCorrente.getId());
        List listaTurma = new ArrayList();

        if (turmaCorrente != null) {
            listaTurma.add(turmaCorrente);
        }

        listaDataModel = new ListDataModel(listaTurma);

        return "turmaExibirTodas";
    }
    
    public String buscaPorNomeDisciplina() {
        List<Turma> listaTurma = turmaService.getPorNomeDisciplina(nomeDisciplinaBusca);

        listaDataModel = new ListDataModel(listaTurma);

        return "turmaExibirTodas";
    }

    public String cadastrar() {
        turmaCorrente = new Turma();

        return "cadastrarTurma";
    }

    public String salvar() {
        turmaCorrente.setDisciplina(comboDisciplina.getObjetoSelecionado());
        turmaService.inserir(turmaCorrente);

        return "turmaSalvar";
    }

    public String salvarEdicao() {
        turmaCorrente.setDisciplina(comboDisciplina.getObjetoSelecionado());
        turmaService.setAlteracao(turmaCorrente);

        return "turmaSalvarEdicao";
    }

    public String voltar() {
        turmaCorrente = new Turma();

        return "voltar";
    }

    public String voltarBusca() {
        turmaCorrente = new Turma();

        return "turmaVoltarBusca";
    }

    public String voltarExibirTodos() {
        turmaCorrente = new Turma();

        return "turmaVoltarExibirTodos";
    }

    public TurmaService getTurmaService() {
        return turmaService;
    }

    public void setTurmaService(TurmaService turmaService) {
        this.turmaService = turmaService;
    }

    public List<Turma> getLista() {
        return lista;
    }

    public void setLista(List<Turma> lista) {
        this.lista = lista;
    }

    public Turma getTurmaCorrente() {
        return turmaCorrente;
    }

    public void setTurmaCorrente(Turma turmaCorrente) {
        this.turmaCorrente = turmaCorrente;
    }

    public ListDataModel getListaDataModel() {
        return listaDataModel;
    }

    public void setListaDataModel(ListDataModel listaDataModel) {
        this.listaDataModel = listaDataModel;
    }

    public List<AlunoTurma> getListaAlunoTurma() {
        return listaAlunoTurma;
    }

    public void setListaAlunoTurma(List<AlunoTurma> listaAlunoTurma) {
        this.listaAlunoTurma = listaAlunoTurma;
    }
    
    public String getNomeDisciplinaBusca() {
        return nomeDisciplinaBusca;
    }

    public void setNomeDisciplinaBusca(String nomeDisciplinaBusca) {
        this.nomeDisciplinaBusca = nomeDisciplinaBusca;
    }
    
    public SelectOneDataModel<Disciplina> getComboDisciplina() {
        if (comboDisciplina == null) {
            comboDisciplina = new SelectOneDataModel<Disciplina>(disciplinaService.getListaCompletaOrdenadaPorNome());
        }
        return comboDisciplina;
    }

    public void setComboDisciplina(SelectOneDataModel<Disciplina> comboDisciplina) {
        this.comboDisciplina = comboDisciplina;
    }
}
